home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / info / internals.info-7.z / internals.info-7
Encoding:
GNU Info File  |  1998-05-21  |  29.3 KB  |  661 lines

  1. This is Info file ../../info/internals.info, produced by Makeinfo
  2. version 1.68 from the input file internals.texi.
  3.  
  4.    Copyright (C) 1992 - 1996 Ben Wing.  Copyright (C) 1996, 1997 Sun
  5. Microsystems.  Copyright (C) 1994, 1995 Free Software Foundation.
  6. Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
  7.  
  8.    Permission is granted to make and distribute verbatim copies of this
  9. manual provided the copyright notice and this permission notice are
  10. preserved on all copies.
  11.  
  12.    Permission is granted to copy and distribute modified versions of
  13. this manual under the conditions for verbatim copying, provided that the
  14. entire resulting derived work is distributed under the terms of a
  15. permission notice identical to this one.
  16.  
  17.    Permission is granted to copy and distribute translations of this
  18. manual into another language, under the above conditions for modified
  19. versions, except that this permission notice may be stated in a
  20. translation approved by the Foundation.
  21.  
  22.    Permission is granted to copy and distribute modified versions of
  23. this manual under the conditions for verbatim copying, provided also
  24. that the section entitled "GNU General Public License" is included
  25. exactly as in the original, and provided that the entire resulting
  26. derived work is distributed under the terms of a permission notice
  27. identical to this one.
  28.  
  29.    Permission is granted to copy and distribute translations of this
  30. manual into another language, under the above conditions for modified
  31. versions, except that the section entitled "GNU General Public License"
  32. may be included in a translation approved by the Free Software
  33. Foundation instead of in the original English.
  34.  
  35. 
  36. File: internals.info,  Node: Line Start Cache,  Prev: Critical Redisplay Sections,  Up: The Redisplay Mechanism
  37.  
  38. Line Start Cache
  39. ================
  40.  
  41.    The traditional scrolling code in Emacs breaks in a variable height
  42. world.  It depends on the key assumption that the number of lines that
  43. can be displayed at any given time is fixed.  This led to a complete
  44. separation of the scrolling code from the redisplay code.  In order to
  45. fully support variable height lines, the scrolling code must actually be
  46. tightly integrated with redisplay.  Only redisplay can determine how
  47. many lines will be displayed on a screen for any given starting point.
  48.  
  49.    What is ideally wanted is a complete list of the starting buffer
  50. position for every possible display line of a buffer along with the
  51. height of that display line.  Maintaining such a full list would be very
  52. expensive.  We settle for having it include information for all areas
  53. which we happen to generate anyhow (i.e. the region currently being
  54. displayed) and for those areas we need to work with.
  55.  
  56.    In order to ensure that the cache accurately represents what
  57. redisplay would actually show, it is necessary to invalidate it in many
  58. situations.  If the buffer changes, the starting positions may no longer
  59. be correct.  If a face or an extent has changed then the line heights
  60. may have altered.  These events happen frequently enough that the cache
  61. can end up being constantly disabled.  With this potentially constant
  62. invalidation when is the cache ever useful?
  63.  
  64.    Even if the cache is invalidated before every single usage, it is
  65. necessary.  Scrolling often requires knowledge about display lines which
  66. are actually above or below the visible region.  The cache provides a
  67. convenient light-weight method of storing this information for multiple
  68. display regions.  This knowledge is necessary for the scrolling code to
  69. always obey the First Golden Rule of Redisplay.
  70.  
  71.    If the cache already contains all of the information that the
  72. scrolling routines happen to need so that it doesn't have to go
  73. generate it, then we are able to obey the Third Golden Rule of
  74. Redisplay.  The first thing we do to help out the cache is to always
  75. add the displayed region.  This region had to be generated anyway, so
  76. the cache ends up getting the information basically for free.  In those
  77. cases where a user is simply scrolling around viewing a buffer there is
  78. a high probability that this is sufficient to always provide the needed
  79. information.  The second thing we can do is be smart about invalidating
  80. the cache.
  81.  
  82.    TODO - Be smart about invalidating the cache.  Potential places:
  83.  
  84.    * Insertions at end-of-line which don't cause line-wraps do not
  85.      alter the starting positions of any display lines.  These types of
  86.      buffer modifications should not invalidate the cache.  This is
  87.      actually a large optimization for redisplay speed as well.
  88.  
  89.    * Buffer modifications frequently only affect the display of lines
  90.      at and below where they occur.  In these situations we should only
  91.      invalidate the part of the cache starting at where the
  92.      modification occurs.
  93.  
  94.    In case you're wondering, the Second Golden Rule of Redisplay is not
  95. applicable.
  96.  
  97. 
  98. File: internals.info,  Node: Extents,  Next: Faces and Glyphs,  Prev: The Redisplay Mechanism,  Up: Top
  99.  
  100. Extents
  101. *******
  102.  
  103. * Menu:
  104.  
  105. * Introduction to Extents::     Extents are ranges over text, with properties.
  106. * Extent Ordering::             How extents are ordered internally.
  107. * Format of the Extent Info::   The extent information in a buffer or string.
  108. * Zero-Length Extents::         A weird special case.
  109. * Mathematics of Extent Ordering::      A rigorous foundation.
  110. * Extent Fragments::            Cached information useful for redisplay.
  111.  
  112. 
  113. File: internals.info,  Node: Introduction to Extents,  Next: Extent Ordering,  Up: Extents
  114.  
  115. Introduction to Extents
  116. =======================
  117.  
  118.    Extents are regions over a buffer, with a start and an end position
  119. denoting the region of the buffer included in the extent.  In addition,
  120. either end can be closed or open, meaning that the endpoint is or is
  121. not logically included in the extent.  Insertion of a character at a
  122. closed endpoint causes the character to go inside the extent; insertion
  123. at an open endpoint causes the character to go outside.
  124.  
  125.    Extent endpoints are stored using memory indices (see `insdel.c'),
  126. to minimize the amount of adjusting that needs to be done when
  127. characters are inserted or deleted.
  128.  
  129.    (Formerly, extent endpoints at the gap could be either before or
  130. after the gap, depending on the open/closedness of the endpoint.  The
  131. intent of this was to make it so that insertions would automatically go
  132. inside or out of extents as necessary with no further work needing to
  133. be done.  It didn't work out that way, however, and just ended up
  134. complexifying and buggifying all the rest of the code.)
  135.  
  136. 
  137. File: internals.info,  Node: Extent Ordering,  Next: Format of the Extent Info,  Prev: Introduction to Extents,  Up: Extents
  138.  
  139. Extent Ordering
  140. ===============
  141.  
  142.    Extents are compared using memory indices.  There are two orderings
  143. for extents and both orders are kept current at all times.  The normal
  144. or "display" order is as follows:
  145.  
  146.      Extent A is ``less than'' extent B, that is, earlier in the display order,
  147.      if:    A-start < B-start,
  148.      or if: A-start = B-start, and A-end > B-end
  149.  
  150.    So if two extents begin at the same position, the larger of them is
  151. the earlier one in the display order (`EXTENT_LESS' is true).
  152.  
  153.    For the e-order, the same thing holds:
  154.  
  155.      Extent A is ``less than'' extent B in e-order, that is, later in the buffer,
  156.      if:    A-end < B-end,
  157.      or if: A-end = B-end, and A-start > B-start
  158.  
  159.    So if two extents end at the same position, the smaller of them is
  160. the earlier one in the e-order (`EXTENT_E_LESS' is true).
  161.  
  162.    The display order and the e-order are complementary orders: any
  163. theorem about the display order also applies to the e-order if you swap
  164. all occurrences of "display order" and "e-order", "less than" and
  165. "greater than", and "extent start" and "extent end".
  166.  
  167. 
  168. File: internals.info,  Node: Format of the Extent Info,  Next: Zero-Length Extents,  Prev: Extent Ordering,  Up: Extents
  169.  
  170. Format of the Extent Info
  171. =========================
  172.  
  173.    An extent-info structure consists of a list of the buffer or string's
  174. extents and a "stack of extents" that lists all of the extents over a
  175. particular position.  The stack-of-extents info is used for
  176. optimization purposes - it basically caches some info that might be
  177. expensive to compute.  Certain otherwise hard computations are easy
  178. given the stack of extents over a particular position, and if the stack
  179. of extents over a nearby position is known (because it was calculated
  180. at some prior point in time), it's easy to move the stack of extents to
  181. the proper position.
  182.  
  183.    Given that the stack of extents is an optimization, and given that
  184. it requires memory, a string's stack of extents is wiped out each time
  185. a garbage collection occurs.  Therefore, any time you retrieve the
  186. stack of extents, it might not be there.  If you need it to be there,
  187. use the `_force' version.
  188.  
  189.    Similarly, a string may or may not have an extent_info structure.
  190. (Generally it won't if there haven't been any extents added to the
  191. string.) So use the `_force' version if you need the extent_info
  192. structure to be there.
  193.  
  194.    A list of extents is maintained as a double gap array: one gap array
  195. is ordered by start index (the "display order") and the other is
  196. ordered by end index (the "e-order").  Note that positions in an extent
  197. list should logically be conceived of as referring *to* a particular
  198. extent (as is the norm in programs) rather than sitting between two
  199. extents.  Note also that callers of these functions should not be aware
  200. of the fact that the extent list is implemented as an array, except for
  201. the fact that positions are integers (this should be generalized to
  202. handle integers and linked list equally well).
  203.  
  204. 
  205. File: internals.info,  Node: Zero-Length Extents,  Next: Mathematics of Extent Ordering,  Prev: Format of the Extent Info,  Up: Extents
  206.  
  207. Zero-Length Extents
  208. ===================
  209.  
  210.    Extents can be zero-length, and will end up that way if their
  211. endpoints are explicitly set that way or if their detachable property
  212. is nil and all the text in the extent is deleted. (The exception is
  213. open-open zero-length extents, which are barred from existing because
  214. there is no sensible way to define their properties.  Deletion of the
  215. text in an open-open extent causes it to be converted into a closed-open
  216. extent.)  Zero-length extents are primarily used to represent
  217. annotations, and behave as follows:
  218.  
  219.   1. Insertion at the position of a zero-length extent expands the
  220.      extent if both endpoints are closed; goes after the extent if it
  221.      is closed-open; and goes before the extent if it is open-closed.
  222.  
  223.   2. Deletion of a character on a side of a zero-length extent whose
  224.      corresponding endpoint is closed causes the extent to be detached
  225.      if it is detachable; if the extent is not detachable or the
  226.      corresponding endpoint is open, the extent remains in the buffer,
  227.      moving as necessary.
  228.  
  229.    Note that closed-open, non-detachable zero-length extents behave
  230. exactly like markers and that open-closed, non-detachable zero-length
  231. extents behave like the "point-type" marker in Mule.
  232.  
  233. 
  234. File: internals.info,  Node: Mathematics of Extent Ordering,  Next: Extent Fragments,  Prev: Zero-Length Extents,  Up: Extents
  235.  
  236. Mathematics of Extent Ordering
  237. ==============================
  238.  
  239.    The extents in a buffer are ordered by "display order" because that
  240. is that order that the redisplay mechanism needs to process them in.
  241. The e-order is an auxiliary ordering used to facilitate operations over
  242. extents.  The operations that can be performed on the ordered list of
  243. extents in a buffer are
  244.  
  245.   1. Locate where an extent would go if inserted into the list.
  246.  
  247.   2. Insert an extent into the list.
  248.  
  249.   3. Remove an extent from the list.
  250.  
  251.   4. Map over all the extents that overlap a range.
  252.  
  253.    (4) requires being able to determine the first and last extents that
  254. overlap a range.
  255.  
  256.    NOTE: "overlap" is used as follows:
  257.  
  258.    * two ranges overlap if they have at least one point in common.
  259.      Whether the endpoints are open or closed makes a difference here.
  260.  
  261.    * a point overlaps a range if the point is contained within the
  262.      range; this is equivalent to treating a point P as the range [P,
  263.      P].
  264.  
  265.    * In the case of an *extent* overlapping a point or range, the extent
  266.      is normally treated as having closed endpoints.  This applies
  267.      consistently in the discussion of stacks of extents and such below.
  268.      Note that this definition of overlap is not necessarily consistent
  269.      with the extents that `map-extents' maps over, since `map-extents'
  270.      sometimes pays attention to whether the endpoints of an extents
  271.      are open or closed.  But for our purposes, it greatly simplifies
  272.      things to treat all extents as having closed endpoints.
  273.  
  274.    First, define >, <, <=, etc. as applied to extents to mean
  275. comparison according to the display order.  Comparison between an
  276. extent E and an index I means comparison between E and the range [I, I].
  277.  
  278.    Also define e>, e<, e<=, etc. to mean comparison according to the
  279. e-order.
  280.  
  281.    For any range R, define R(0) to be the starting index of the range
  282. and R(1) to be the ending index of the range.
  283.  
  284.    For any extent E, define E(next) to be the extent directly following
  285. E, and E(prev) to be the extent directly preceding E.  Assume E(next)
  286. and E(prev) can be determined from E in constant time.  (This is
  287. because we store the extent list as a doubly linked list.)
  288.  
  289.    Similarly, define E(e-next) and E(e-prev) to be the extents directly
  290. following and preceding E in the e-order.
  291.  
  292.    Now:
  293.  
  294.    Let R be a range.  Let F be the first extent overlapping R.  Let L
  295. be the last extent overlapping R.
  296.  
  297.    Theorem 1: R(1) lies between L and L(next), i.e. L <= R(1) < L(next).
  298.  
  299.    This follows easily from the definition of display order.  The basic
  300. reason that this theorem applies is that the display order sorts by
  301. increasing starting index.
  302.  
  303.    Therefore, we can determine L just by looking at where we would
  304. insert R(1) into the list, and if we know F and are moving forward over
  305. extents, we can easily determine when we've hit L by comparing the
  306. extent we're at to R(1).
  307.  
  308.      Theorem 2: F(e-prev) e< [1, R(0)] e<= F.
  309.  
  310.    This is the analog of Theorem 1, and applies because the e-order
  311. sorts by increasing ending index.
  312.  
  313.    Therefore, F can be found in the same amount of time as operation
  314. (1), i.e. the time that it takes to locate where an extent would go if
  315. inserted into the e-order list.
  316.  
  317.    If the lists were stored as balanced binary trees, then operation (1)
  318. would take logarithmic time, which is usually quite fast.  However,
  319. currently they're stored as simple doubly-linked lists, and instead we
  320. do some caching to try to speed things up.
  321.  
  322.    Define a "stack of extents" (or "SOE") as the set of extents
  323. (ordered in the display order) that overlap an index I, together with
  324. the SOE's "previous" extent, which is an extent that precedes I in the
  325. e-order. (Hopefully there will not be very many extents between I and
  326. the previous extent.)
  327.  
  328.    Now:
  329.  
  330.    Let I be an index, let S be the stack of extents on I, let F be the
  331. first extent in S, and let P be S's previous extent.
  332.  
  333.    Theorem 3: The first extent in S is the first extent that overlaps
  334. any range [I, J].
  335.  
  336.    Proof: Any extent that overlaps [I, J] but does not include I must
  337. have a start index > I, and thus be greater than any extent in S.
  338.  
  339.    Therefore, finding the first extent that overlaps a range R is the
  340. same as finding the first extent that overlaps R(0).
  341.  
  342.    Theorem 4: Let I2 be an index such that I2 > I, and let F2 be the
  343. first extent that overlaps I2.  Then, either F2 is in S or F2 is
  344. greater than any extent in S.
  345.  
  346.    Proof: If F2 does not include I then its start index is greater than
  347. I and thus it is greater than any extent in S, including F.  Otherwise,
  348. F2 includes I and thus is in S, and thus F2 >= F.
  349.  
  350. 
  351. File: internals.info,  Node: Extent Fragments,  Prev: Mathematics of Extent Ordering,  Up: Extents
  352.  
  353. Extent Fragments
  354. ================
  355.  
  356.    Imagine that the buffer is divided up into contiguous,
  357. non-overlapping "runs" of text such that no extent starts or ends
  358. within a run (extents that abut the run don't count).
  359.  
  360.    An extent fragment is a structure that holds data about the run that
  361. contains a particular buffer position (if the buffer position is at the
  362. junction of two runs, the run after the position is used) - the
  363. beginning and end of the run, a list of all of the extents in that run,
  364. the "merged face" that results from merging all of the faces
  365. corresponding to those extents, the begin and end glyphs at the
  366. beginning of the run, etc.  This is the information that redisplay needs
  367. in order to display this run.
  368.  
  369.    Extent fragments have to be very quick to update to a new buffer
  370. position when moving linearly through the buffer.  They rely on the
  371. stack-of-extents code, which does the heavy-duty algorithmic work of
  372. determining which extents overly a particular position.
  373.  
  374. 
  375. File: internals.info,  Node: Faces and Glyphs,  Next: Specifiers,  Prev: Extents,  Up: Top
  376.  
  377. Faces and Glyphs
  378. ****************
  379.  
  380.    Not yet documented.
  381.  
  382. 
  383. File: internals.info,  Node: Specifiers,  Next: Menus,  Prev: Faces and Glyphs,  Up: Top
  384.  
  385. Specifiers
  386. **********
  387.  
  388.    Not yet documented.
  389.  
  390. 
  391. File: internals.info,  Node: Menus,  Next: Subprocesses,  Prev: Specifiers,  Up: Top
  392.  
  393. Menus
  394. *****
  395.  
  396.    A menu is set by setting the value of the variable `current-menubar'
  397. (which may be buffer-local) and then calling `set-menubar-dirty-flag'
  398. to signal a change.  This will cause the menu to be redrawn at the next
  399. redisplay.  The format of the data in `current-menubar' is described in
  400. `menubar.c'.
  401.  
  402.    Internally the data in current-menubar is parsed into a tree of
  403. `widget_value's' (defined in `lwlib.h'); this is accomplished by the
  404. recursive function `menu_item_descriptor_to_widget_value()', called by
  405. `compute_menubar_data()'.  Such a tree is deallocated using
  406. `free_widget_value()'.
  407.  
  408.    `update_screen_menubars()' is one of the external entry points.
  409. This checks to see, for each screen, if that screen's menubar needs to
  410. be updated.  This is the case if
  411.  
  412.   1. `set-menubar-dirty-flag' was called since the last redisplay.
  413.      (This function sets the C variable menubar_has_changed.)
  414.  
  415.   2. The buffer displayed in the screen has changed.
  416.  
  417.   3. The screen has no menubar currently displayed.
  418.  
  419.    `set_screen_menubar()' is called for each such screen.  This
  420. function calls `compute_menubar_data()' to create the tree of
  421. widget_value's, then calls `lw_create_widget()',
  422. `lw_modify_all_widgets()', and/or `lw_destroy_all_widgets()' to create
  423. the X-Toolkit widget associated with the menu.
  424.  
  425.    `update_psheets()', the other external entry point, actually changes
  426. the menus being displayed.  It uses the widgets fixed by
  427. `update_screen_menubars()' and calls various X functions to ensure that
  428. the menus are displayed properly.
  429.  
  430.    The menubar widget is set up so that `pre_activate_callback()' is
  431. called when the menu is first selected (i.e. mouse button goes down),
  432. and `menubar_selection_callback()' is called when an item is selected.
  433. `pre_activate_callback()' calls the function in activate-menubar-hook,
  434. which can change the menubar (this is described in `menubar.c').  If
  435. the menubar is changed, `set_screen_menubars()' is called.
  436. `menubar_selection_callback()' enqueues a menu event, putting in it a
  437. function to call (either `eval' or `call-interactively') and its
  438. argument, which is the callback function or form given in the menu's
  439. description.
  440.  
  441. 
  442. File: internals.info,  Node: Subprocesses,  Next: Interface to X Windows,  Prev: Menus,  Up: Top
  443.  
  444. Subprocesses
  445. ************
  446.  
  447.    The fields of a process are:
  448.  
  449. `name'
  450.      A string, the name of the process.
  451.  
  452. `command'
  453.      A list containing the command arguments that were used to start
  454.      this process.
  455.  
  456. `filter'
  457.      A function used to accept output from the process instead of a
  458.      buffer, or `nil'.
  459.  
  460. `sentinel'
  461.      A function called whenever the process receives a signal, or `nil'.
  462.  
  463. `buffer'
  464.      The associated buffer of the process.
  465.  
  466. `pid'
  467.      An integer, the Unix process ID.
  468.  
  469. `childp'
  470.      A flag, non-`nil' if this is really a child process.  It is `nil'
  471.      for a network connection.
  472.  
  473. `mark'
  474.      A marker indicating the position of the end of the last output
  475.      from this process inserted into the buffer.  This is often but not
  476.      always the end of the buffer.
  477.  
  478. `kill_without_query'
  479.      If this is non-`nil', killing XEmacs while this process is still
  480.      running does not ask for confirmation about killing the process.
  481.  
  482. `raw_status_low'
  483. `raw_status_high'
  484.      These two fields record 16 bits each of the process status
  485.      returned by the `wait' system call.
  486.  
  487. `status'
  488.      The process status, as `process-status' should return it.
  489.  
  490. `tick'
  491. `update_tick'
  492.      If these two fields are not equal, a change in the status of the
  493.      process needs to be reported, either by running the sentinel or by
  494.      inserting a message in the process buffer.
  495.  
  496. `pty_flag'
  497.      Non-`nil' if communication with the subprocess uses a PTY; `nil'
  498.      if it uses a pipe.
  499.  
  500. `infd'
  501.      The file descriptor for input from the process.
  502.  
  503. `outfd'
  504.      The file descriptor for output to the process.
  505.  
  506. `subtty'
  507.      The file descriptor for the terminal that the subprocess is using.
  508.      (On some systems, there is no need to record this, so the value is
  509.      `-1'.)
  510.  
  511. `tty_name'
  512.      The name of the terminal that the subprocess is using, or `nil' if
  513.      it is using pipes.
  514.  
  515. 
  516. File: internals.info,  Node: Interface to X Windows,  Next: Index,  Prev: Subprocesses,  Up: Top
  517.  
  518. Interface to X Windows
  519. **********************
  520.  
  521.    Not yet documented.
  522.  
  523. 
  524. File: internals.info,  Node: Index,  Prev: Interface to X Windows,  Up: Top
  525.  
  526. Index
  527. *****
  528.  
  529. * Menu:
  530.  
  531. * Amdahl Corporation:                    XEmacs.
  532. * Andreessen, Marc:                      XEmacs.
  533. * asynchronous subprocesses:             Modules for Interfacing with the Operating System.
  534. * Baur, Steve:                           XEmacs.
  535. * Benson, Eric:                          Lucid Emacs.
  536. * bridge, playing:                       XEmacs From the Outside.
  537. * Buchholz, Martin:                      XEmacs.
  538. * C vs. Lisp:                            The Lisp Language.
  539. * caller-protects (GCPRO rule):          Writing Lisp Primitives.
  540. * case table:                            Modules for Other Aspects of the Lisp Interpreter and Object System.
  541. * closer:                                Lstream Methods.
  542. * closure:                               The XEmacs Object System (Abstractly Speaking).
  543. * Common Lisp:                           The Lisp Language.
  544. * conservative garbage collection:       GCPROing.
  545. * copy-on-write:                         General Coding Rules.
  546. * critical redisplay sections:           Critical Redisplay Sections.
  547. * Devin, Matthieu:                       Lucid Emacs.
  548. * display order of extents:              Mathematics of Extent Ordering.
  549. * dynamic array:                         Low-Level Modules.
  550. * dynamic scoping:                       The Lisp Language.
  551. * dynamic types:                         The Lisp Language.
  552. * Energize:                              Lucid Emacs.
  553. * Epoch <1>:                             XEmacs.
  554. * Epoch:                                 Lucid Emacs.
  555. * extent fragment:                       Extent Fragments.
  556. * extent mathematics:                    Mathematics of Extent Ordering.
  557. * extent ordering:                       Mathematics of Extent Ordering.
  558. * extents, display order:                Mathematics of Extent Ordering.
  559. * external widget:                       Modules for Interfacing with X Windows.
  560. * flusher:                               Lstream Methods.
  561. * Free Software Foundation:              A History of Emacs.
  562. * frob block:                            Introduction to Allocation.
  563. * FSF:                                   A History of Emacs.
  564. * FSF Emacs <1>:                         GNU Emacs 20.
  565. * FSF Emacs:                             GNU Emacs 19.
  566. * garbage collection:                    Garbage Collection.
  567. * garbage collection protection:         Writing Lisp Primitives.
  568. * garbage collection, conservative:      GCPROing.
  569. * GNU Emacs 19:                          GNU Emacs 19.
  570. * GNU Emacs 20:                          GNU Emacs 20.
  571. * Gosling, James <1>:                    The Lisp Language.
  572. * Gosling, James:                        Through Version 18.
  573. * Great Usenet Renaming:                 Through Version 18.
  574. * Hackers (Steven Levy):                 A History of Emacs.
  575. * hierarchy of windows:                  Window Hierarchy.
  576. * history of Emacs:                      A History of Emacs.
  577. * Illinois, University of:               XEmacs.
  578. * interactive:                           Modules for Standard Editing Operations.
  579. * interning:                             The XEmacs Object System (Abstractly Speaking).
  580. * ITS (Incompatible Timesharing System): A History of Emacs.
  581. * Java:                                  The Lisp Language.
  582. * Java vs. Lisp:                         The Lisp Language.
  583. * Kaplan, Simon:                         XEmacs.
  584. * Levy, Steven:                          A History of Emacs.
  585. * line start cache:                      Line Start Cache.
  586. * Lisp vs. C:                            The Lisp Language.
  587. * Lisp vs. Java:                         The Lisp Language.
  588. * lstream:                               Modules for Interfacing with the File System.
  589. * Lstream_close:                         Lstream Functions.
  590. * Lstream_fgetc:                         Lstream Functions.
  591. * Lstream_flush:                         Lstream Functions.
  592. * Lstream_fputc:                         Lstream Functions.
  593. * Lstream_fungetc:                       Lstream Functions.
  594. * Lstream_getc:                          Lstream Functions.
  595. * Lstream_new:                           Lstream Functions.
  596. * Lstream_putc:                          Lstream Functions.
  597. * Lstream_read:                          Lstream Functions.
  598. * Lstream_reopen:                        Lstream Functions.
  599. * Lstream_rewind:                        Lstream Functions.
  600. * Lstream_set_buffering:                 Lstream Functions.
  601. * Lstream_ungetc:                        Lstream Functions.
  602. * Lstream_unread:                        Lstream Functions.
  603. * Lstream_write:                         Lstream Functions.
  604. * Lucid Emacs:                           Lucid Emacs.
  605. * Lucid Inc.:                            Lucid Emacs.
  606. * mark and sweep:                        Garbage Collection.
  607. * mark method <1>:                       lrecords.
  608. * mark method:                           Modules for Other Aspects of the Lisp Interpreter and Object System.
  609. * marker:                                Lstream Methods.
  610. * mathematics of extents:                Mathematics of Extent Ordering.
  611. * merging attempts:                      XEmacs.
  612. * MIT:                                   A History of Emacs.
  613. * Mlynarik, Richard:                     GNU Emacs 19.
  614. * MULE merged XEmacs appears:            XEmacs.
  615. * NAS:                                   Modules for Interfacing with the Operating System.
  616. * native sound:                          Modules for Interfacing with the Operating System.
  617. * network connections:                   Modules for Interfacing with the Operating System.
  618. * network sound:                         Modules for Interfacing with the Operating System.
  619. * pane:                                  Modules for the Basic Displayable Lisp Objects.
  620. * permanent objects:                     The XEmacs Object System (Abstractly Speaking).
  621. * pi, calculating:                       XEmacs From the Outside.
  622. * pseudo_closer:                         Lstream Methods.
  623. * pure space:                            Basic Lisp Modules.
  624. * read syntax:                           The XEmacs Object System (Abstractly Speaking).
  625. * read-eval-print:                       XEmacs From the Outside.
  626. * reader:                                Lstream Methods.
  627. * record type:                           How Lisp Objects Are Represented in C.
  628. * relocating allocator:                  Low-Level Modules.
  629. * rename to XEmacs:                      XEmacs.
  630. * rewinder:                              Lstream Methods.
  631. * RMS:                                   A History of Emacs.
  632. * scanner:                               Modules for Other Aspects of the Lisp Interpreter and Object System.
  633. * scoping, dynamic:                      The Lisp Language.
  634. * seekable_p:                            Lstream Methods.
  635. * selections:                            Modules for Interfacing with X Windows.
  636. * Sexton, Harlan:                        Lucid Emacs.
  637. * sound, native:                         Modules for Interfacing with the Operating System.
  638. * sound, network:                        Modules for Interfacing with the Operating System.
  639. * SPARCWorks:                            XEmacs.
  640. * Stallman, Richard:                     A History of Emacs.
  641. * subprocesses, asynchronous:            Modules for Interfacing with the Operating System.
  642. * subprocesses, synchronous:             Modules for Interfacing with the Operating System.
  643. * Sun Microsystems:                      XEmacs.
  644. * synchronous subprocesses:              Modules for Interfacing with the Operating System.
  645. * taxes, doing:                          XEmacs From the Outside.
  646. * TECO:                                  A History of Emacs.
  647. * temporary objects:                     The XEmacs Object System (Abstractly Speaking).
  648. * Thompson, Chuck:                       XEmacs.
  649. * types, dynamic:                        The Lisp Language.
  650. * University of Illinois:                XEmacs.
  651. * Win-Emacs:                             XEmacs.
  652. * window (in Emacs):                     Modules for the Basic Displayable Lisp Objects.
  653. * window hierarchy:                      Window Hierarchy.
  654. * window point internals:                The Window Object.
  655. * Wing, Ben:                             XEmacs.
  656. * writer:                                Lstream Methods.
  657. * XEmacs:                                XEmacs.
  658. * Zawinski, Jamie:                       Lucid Emacs.
  659.  
  660.  
  661.